#include <cstdio>
#include <iostream>
using namespace std;
#define MAXSIZE 100
int length=5;//由于length++,所以不能定义，只能引入
#define ERROR 0
#define OK 1


//顺序表的取值
int GetElem(int L[],int i,int &e){
	if (i<1||i>length) return ERROR;  
	e=L[i-1];
}

//顺序表的查找
int LocateElem(int L[],int e){

	for(int i=0; i<length; i++)
		if(e == L[i]) return i+1;
	return 0;
}

int ListInsert(int L[], int i, int &e){
	if(i < 1 || i > length+1) return ERROR;//加一可以在末位后面添加数据
	if(length==0||length == MAXSIZE) return ERROR;
	
	for(int j = length - 1; j >= i - 1; j--){
		L[j + 1] = L[j];   
	}
	L[i - 1] = e;   // 将插入的数据e放在i位置上
	length++;   // 放在for循环外部确保只增加一次
	
	return OK;
}

int Delete(int L[], int i) {  
	if (i < 1 || i > length) return ERROR;
	if (length == 0) return ERROR;  
	
	// 如果要删除的是最后一个元素，则无需移动其他元素  
	if (i == length) {  
		length--;  
		return OK;  
	}  	
	for (int j = i; j < length; j++) {  
		L[j - 1] = L[j]; // 将元素向前移动一个位置  
	}  
	length--; // 减少数组的有效长度  
	
	return OK;  
}

int modify(int L[], int i, int &e) {  
	if (i < 1 || i > length) return ERROR; 
	if (length == 0) return ERROR; 
	L[i - 1] = e; // 直接根据位置i来修改元素的值  
	return OK;  
}


int main(){
	bool chushihua = false; // 跟踪数组是否已初始化
	bool exit = false;//确保不退出程序
	while(!exit){
	int *a;
	int e,x,y,mode;
		
	cout<<endl;
	cout<<"请输入模式[1(输出顺序表)；2(取对应位置值)；3(查找数据);4(插入数据);5(删除数据)；6(修改数据);7(重置顺序表)]：";
	cin>>mode;
		
	while(mode<1||mode>7){
		cout << "无效的选择，请重新输入。" << endl; 
		cout<<"请输入模式[1(输出顺序表)；2(取对应位置值)；3(查找数据);4(插入数据);5(删除数据)；6(修改数据);7(重置顺序表)]：";
		cin>>mode;
	}
		
	if(!chushihua){
		cout << "请输入数组基础长度:";  
		cin >> length;
		cout<<"请输入数组元素（每个元素输入完成按下换行）:";
		a = new int[MAXSIZE];
		
		for(int i = 0; i < length; i++){//输入数组
			int s=length-1-i;//s为剩余未输入的元素个数
			cin >> a[i];
			if(s>0){
				cout<<"剩余"<<length-1-i<<"个元素未输入:";	
			}
		}
		chushihua=true;
	}
	
	switch (mode) {
		default:  
			cout << "无效的选择，请重新输入。" << endl; 
			break; 
		case 1://输出
			cout << "输出:" << endl;
			for(int j=0; j<length; j++)
				cout<<'\t'<<a[j];
			break; 
		case 2://取位置的元素值
			cout<<"取哪个位置:";
			cin>>y;
			if(GetElem(a,y,e)==0)  cout<<"取值非法！";
			else  cout<<"取到的数据是："<<e;
			break;
		case 3://查找元素对应位置
			int g;
			cout<<"查找哪个元素:";
			cin>>g;
			x=LocateElem(a,g);
			if(x==0) cout<<"查找失败!";
			else cout<<"查找成功，所在位置："<<x;
			break;
		case 4://插入元素
			int Pos, Value;//Pos为位置，Value为值
			cout << "输入要插入的位置：";
			cin >> Pos;
			cout << "输入要插入的数据：";
			cin >> Value;
			if(ListInsert(a, Pos, Value) == ERROR)
				cout << "插入失败！";
			else{
				cout << "插入成功！当前数组为：";
			for(int j = 0; j < length; j++)
				cout << '\t' << a[j];
			}
			break;
		case 5://删除元素
			int dPos;
			cout << "输入要删除的位置：";
			cin >> dPos;
			if(Delete(a, dPos) == ERROR)
				cout << "删除失败！";
			else{
				cout << "删除成功！当前数组为：";
				for(int j = 0; j < length; j++)
					cout << '\t' << a[j];
			}
			break;
		case 6:
			int mPos,mValue;
			cout << "输入要修改的位置：";
			cin >> mPos;
			cout << "输入要修改的数据：";
			cin >> mValue;
			if(modify(a, mPos, mValue) == ERROR)
				cout << "修改失败！";
			else{
				cout << "修改成功！当前数组为：";
				for(int j = 0; j < length; j++)
					cout << '\t' << a[j];
			}
			break;
		case 7:
			chushihua=false;
			cout<<"重置成功！";
			break;
		}  
	/*不用Switch的切换模式的方法
	  if(mode==1){//输出
	  
	  }
	  else if(mode==2){//取位置的元素值
	  
	  }
	  else if(mode==3){//查找元素对应位置
	  
	  }
	  else if(mode==4){//插入元素
	  
	  }
	  else return ERROR;
	 */
	}
	return 0;

}
